package com.lfy.ai;

import com.alibaba.dashscope.common.Message;
import com.lfy.modules.common.domain.BaseChatVO;
import com.lfy.modules.common.utils.JsonUtils;
import com.lfy.websocket.cache.ChannelCache;
import io.netty.channel.Channel;

import java.util.List;

/**
 * AI聊天标准抽象类
 * 请在application.yml文件中开启对应的模型，并在字典中，配置api-key
 * 如：
 * 通义千问
 *   ai:
 *     qwen:
 *       enable: true
 *  字典：package com.lfy.modules.common.config.sys。DictionariesKey;
 *       在数据监控-》字典数据中添加 KEY: ai:qwen:api:key  VALUE: 你的api-key
 *
 * @author <a href="https://www.lvfeiy.top">lvfeiyang</a>
 * @date 2024/6/22 12:45
 */
public abstract class AiChatStandard {
    /**
     * 选择模型
     * @param aiCode AI模型code
     * @return 是否选择进入策略
     */
    protected abstract boolean choice(Integer aiCode );

    /**
     * 问答
     * @param question 问题
     * @param aiModelCode AI模型code
     * @param clientId 客户端id
     */
    public abstract void ask(String question,Integer aiModelCode,String clientId,Integer groupId,String url);
    /**
     * token计费输入
     * @return token
     */
    public abstract Integer tokenizer(String question,Integer aiModelType);
    /**
     * 计费输出
     * @param messages 对话列表
     * @param modelType AI模型类型
     */
    protected abstract void tokenizerAfter(Integer modelType, List<Message> messages,String url);


    protected void sendMsg(String clientId, BaseChatVO<?> msg){
        // 发送消息
        Channel channel = ChannelCache.getChannel(clientId);
        if (channel!= null && channel.isActive()) {
            channel.writeAndFlush(toJson(msg));
        }
    }
    private String toJson( BaseChatVO<?> msg) {
        return JsonUtils.toStr(msg);
    }
}
